const Koa = require('koa')
const app = new Koa()
const bodyParser = require('koa-bodyparser')
const static = require('koa-static')
const path = require('path')
const fs = require('fs')
const cors = require('@koa/cors')
const commonRouter = require('./routes/common') // 导入公共模块路由
const userRouter = require('./routes/user') // 导入用户模块路由
const articleRouter = require('./routes/article') // 导入文章模块路由
const messageRouter = require('./routes/message') // 导入消息模块路由
const logger = require('./middleware/logger') // 导入自定义中间件
const config = require('./config/index') // 导入配置
const WebSocketService = require('./utils/websocket')
const Task = require('./utils/task') // 定时任务
const swaggerSpec = require('./config/swagger')
const { koaSwagger } = require('koa2-swagger-ui') // 使用 swagger 文档
const { koaBody } = require('koa-body')

Task.delAccount() // 定时删除已注销账号

app.use(logger()) // 使用自定义中间件
app.use(bodyParser()) // 使用 bodyParser 中间件
app.use(static(path.join(__dirname, '../public'))) // 配置静态文件服务

// 配置CORS
app.use(cors({
    origin: function(ctx) {
        // 允许来自所有域的请求（生产环境应限制为特定域名）
        return '*'
    },
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
    maxAge: 5,
    credentials: true,
    allowMethods: ['GET', 'POST', 'DELETE', 'PUT', 'PATCH', 'OPTIONS'],
    allowHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Requested-With'],
}))

// 设置上传目录为 public
const uploadDir = './public'

// 确保上传目录存在
if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true })
}

// 使用 koa-body 配置上传目录（这个中间件要在路由注册之前使用）
app.use(async (ctx, next) => {
    // 如果请求路径是上传路径，则使用koa-body解析
    if (ctx.url === '/upload' && ctx.method === 'POST') {
        await koaBody({
            multipart: true,
            formidable: {
                uploadDir: uploadDir, // 上传文件保存目录
                keepExtensions: true, // 保留文件扩展名
                maxFileSize: 10 * 1024 * 1024, // 最大文件大小为 10MB
            }
        })(ctx, next)
    } else {
      await next()
    }
})

// 使用路由
app.use(commonRouter.routes())
app.use(userRouter.routes())
app.use(articleRouter.routes())
app.use(messageRouter.routes())
app.use(userRouter.allowedMethods())
app.use(articleRouter.allowedMethods())
app.use(commonRouter.allowedMethods())
app.use(messageRouter.allowedMethods())

// 错误处理中间件
app.use(async (ctx, next) => {
	try {
		await next()
	} catch (err) {
		ctx.status = err.status || 500
		ctx.body = {
			error: {
				message: err.message,
				status: ctx.status
			}
		}

		ctx.app.emit('error', err, ctx)
	}
})

// Swagger 文档界面
app.use(
    koaSwagger({
        routePrefix: '/api-docs', // 访问路径
        swaggerOptions: {
            spec: swaggerSpec // 使用上面定义的配置
        },
        hideTopbar: false // 可选：隐藏顶部栏
    })
)

// 全局错误事件监听
app.on('error', (err, ctx) => {
	console.error('Server error:', err, ctx)
})

// 创建 http 服务
const server = require('http').createServer(app.callback())

// 创建WebSocket服务器，共享同一个HTTP服务器
const wss = new WebSocketService(server)

// 启动服务器
const PORT = config.port || 9000
server.listen(PORT, () => {
    // console.log(`Koa server is running on port ${PORT}`)
    // console.log(`API 文档: http://localhost:${PORT}/api-docs`)
    // console.log(`测试连接: ws://localhost:${PORT}/?userId=123`)
})

module.exports = server
